package net.servir.capacidades.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Enumerados;
import net.servir.capacidades.model.ParticipanteBusqueda;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ResponsableBusqueda;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

@Controller
public class ParticipanteOficializarController {

	@Autowired 
	private CapacidadesService capacidadesService;
	@Autowired 
	private CensoService censoService;
	@Autowired 
	private MantenimientoService mantenimientoService;
	
	@RequestMapping("/participanteOficializar.htm")
	public @ModelAttribute("participanteBusqueda")
	ParticipanteBusqueda participanteBusqueda(HttpServletRequest request) {
		
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniUsuario = null;
		if(session.getAttribute("dni") != null)			
			dniUsuario = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del Usuario
		Usuario usuario = capacidadesService.GetUsuarioIdentificacion(dniUsuario);
		
		if (usuario == null)
			return null;
			
		//************************************************************
		session.setAttribute("OBJ_RESP_BUSQ", null);
		session.setAttribute("OBJ_SC_BUSQ", null);
		
		ParticipanteBusqueda obj = new ParticipanteBusqueda();		
		ParticipanteBusqueda objPrevio = null;
		String coddep = null;
		String codpro = null;
		String coddis = null;
		String accion = null;
		String conAmbito = "0";
		String estadoRegistro = null;
		Boolean conCriteriosBusqueda = false;
		Integer idNivelGobierno = 0;
		Integer idSector = 0;
		Integer idEjecutora = null;
		Integer idSistema = 0;
		Integer idAmbito = 0;
		Integer idServicioCivil = null;
		Integer idTest = null;
		//variables nuevas (juank)
		String codRegimen ="";
		String codProfesion ="";
		String fecValidacion = "";
		String fecRegistro = "";
		String correo = "";
		String procedencia = "";
		//String codEstadoParticipante = null;
		// obtener valores del accion de usuario
		coddep = request.getParameter("coddep");
		codpro = request.getParameter("codpro");
		coddis = request.getParameter("coddis");
		estadoRegistro = request.getParameter("estadoRegistro");
		accion = request.getParameter("accion");
		
		
		if(request.getParameter("procedencia") != null)
			procedencia = request.getParameter("procedencia");
		
		if(!procedencia.equals("PARTIC_EDICION"))
		{
		//codEstadoParticipante = request.getParameter("codEstadoParticipante");
		/*================================
		 * llenando los combos profesiones y regimenes
		 *================================ 
		*/
		LinkedList<Profesion> profesions = capacidadesService.ObtenerProfesion();
		LinkedList<Regimen> regimens = capacidadesService.ObtenerRegimen();
		obj.setEstadoRegistro(estadoRegistro);
		
		obj.setRegimens(regimens);
		obj.setProfesions(profesions);
		
		obj.setProvincia(capacidadesService.ObtenerProvincias(coddep));
		obj.setDistritos(capacidadesService.ObtenerDistritos(coddep, codProfesion));
		obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());
		
		if(request.getParameter("estadoRegistro") != null)
			obj.setEstadoRegistro(request.getParameter("estadoRegistro"));
			System.out.println("request.getParameter(\"idTest\") = "+request.getParameter("idTest"));
		if (request.getParameter("idTest") != null)
			idTest = Integer.parseInt(request.getParameter("idTest"));
		
		if (accion != null)
			if (accion.equals("RETORNO"))
				accion = null;
		
		if (accion != null && !accion.equals(""))
		{
			if (request.getParameter("idNivelGobierno") != null)
				idNivelGobierno = Integer.parseInt(request.getParameter("idNivelGobierno").toString());

			if (request.getParameter("idSector") != null)
				idSector = Integer.parseInt(request.getParameter("idSector").toString());

			if (request.getParameter("idServicioCivil") != null & !request.getParameter("idServicioCivil").equals(""))
				idServicioCivil = Integer.parseInt(request.getParameter("idServicioCivil").toString());

			if (request.getParameter("lregimen") != null && !request.getParameter("lregimen").trim().equals(""))
				codRegimen = request.getParameter("lregimen");
			
			if (request.getParameter("lprofesion") != null && !request.getParameter("lprofesion").trim().equals(""))
				codProfesion = request.getParameter("lprofesion");
			if (request.getParameter("fecRegistro") != null && !request.getParameter("fecRegistro").trim().equals(""))
				fecRegistro= request.getParameter("fecRegistro");
			if (request.getParameter("fecValidacion") != null && !request.getParameter("fecValidacion").trim().equals(""))
				fecValidacion= request.getParameter("fecValidacion");
			String ubigeo = "";
			if (coddep != null && !coddep.equals("0"))
				ubigeo = coddep;
			if (codpro != null && !codpro.equals("0"))
				ubigeo += codpro;
			if (coddis != null && !coddis.equals("0"))
				ubigeo += coddis;
				
			
			if (request.getParameter("idEjecutora") != null & idNivelGobierno != null ) //& idPliego != null
			{
				if (!(request.getParameter("idEjecutora").equals("")) ) // & idPliego != 0
				{	
					idEjecutora = Integer.parseInt(request.getParameter("idEjecutora").toString());
					obj.setIdEjecutora(idEjecutora);
					obj.setEjecutoras(capacidadesService.ObtenerEjecutorasNivelGobierno(idNivelGobierno,ubigeo,idSector));
				}
			}
			obj.setCoddep(coddep);
			
			if (coddep != null)
			{
				if (!coddep.equals("0"))
				{
					obj.setCoddep(coddep);
					obj.setProvincias(capacidadesService.ObtenerProvincias(coddep));
				}
			}
			
			if (accion.equals("REFRESCARDEP"))
			{
				obj.setCodpro("0");
				codpro = null;
			}

			if (codpro != null )
			{	
				obj.setCodpro(codpro);
				if (!codpro.equals("") & !(codpro .equals("0")))
				{
					obj.setDistritos(capacidadesService.ObtenerDistritos(coddep, codpro));
				}
			}
		}
		else
			obj.setAccion("REFRESCAR");
		
		
		if (idNivelGobierno == Enumerados.NivelGobiernoConSector.NACIONAL.getCodigo())
			obj.setSectores(capacidadesService.ObtenerSectors());
		
		// busco el test activo
		Iterator itrT = null;
		Test t = null;
		itrT = obj.getTest().iterator();
		if (itrT!= null)
		{
		Integer total_rows = obj.getTest().size();
		Integer row = 0; 
		while(itrT.hasNext()){
			row += 1;
			t=(Test)itrT.next();
			if (t.getActivo().equals("S") )
			{
				if (idTest == null)
					idTest = t.getId_test().intValue();
				obj.setTestActivo(t.getTest());
			}
		}
		}
	
		
		/*if (idTest == null)
		{
			idTest = obj.getTest().getFirst().getId_test().intValue();
			obj.setIdTest(idTest);
		}
		else
		{
			obj.setIdTest(idTest);
		}*/
		Number idPuestoTipo = null;
		idSistema = 0;
		if (request.getParameter("idSistema") != null)
		{
			idSistema = Integer.parseInt(request.getParameter("idSistema"));
			obj.setIdSistema(idSistema);
		}		
		
		//Recuperamos la lista de Puestos Tipo
		List<PuestoTipo> optPuestoTipo =  mantenimientoService.getPuestoTipos(idSistema);
		obj.setOptPuestoTipo(optPuestoTipo);

		if (request.getParameter("id_puesto_tipo") != null && !request.getParameter("id_puesto_tipo").equals(""))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo"));
		
		obj.setId_puesto_tipo(idPuestoTipo);

		
		//if (codPerfil != null && !codPerfil.equals(""))
		//	obj.setCodPerfil(codPerfil);
		
		obj.setIdTest(idTest);
		obj.setIdNivelGobierno(idNivelGobierno);
		obj.setIdSector(idSector);
		obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
		obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());
		
		obj.setCodProfesion(codProfesion);
		obj.setRegimens(regimens);
		obj.setCorreo(correo.toUpperCase());
		obj.setFecRegistro(fecRegistro);
		obj.setFecValidacion(fecValidacion);
		if (idNivelGobierno == 2)
			obj.setSectors(capacidadesService.ObtenerSectors());

		obj.setSistemas(capacidadesService.ObtenerSistema());
		

		if (request.getParameter("idAmbito") != null && request.getParameter("idAmbito") != "")
		{
			idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
		}

		if (accion != null && accion.equals("REFRESCARSISTEMA"))
		{
			idAmbito = 0;
		}
		
		obj.setIdAmbito(idAmbito);
		if (idSistema != 0)
		{
			Iterator itr = null;
			Sistema s = null;
			itr = obj.getSistemas().iterator();
			if (itr!= null)
			{
			Integer total_rows = obj.getSistemas().size();
			Integer row = 0; 
			while(itr.hasNext()){
				row += 1;
				s=(Sistema)itr.next();
				if (s.getId_sistema().intValue() == idSistema)
				{
					obj.setAmbitos(capacidadesService.ObtenerAmbito(idSistema));
					if (s.getCon_ambitos().equals("1"))
					{
						conAmbito = "1";
						
					}
					else
					{
						idAmbito = obj.getAmbitos().getFirst().getId_ambito().intValue();
						obj.setIdAmbito(idAmbito);
					}

				}
			}
			}
		}
		if (idSistema == 0)
			idAmbito = 0;
		obj.setConAmbito(conAmbito);
		if (idSistema > 0 && idAmbito > 0)
		obj.setTest(capacidadesService.ObtenerTestDiagnosticoNoEjecutados(idAmbito));
		// set valores de los controles
		
		obj.setAccion(accion);
		if (accion!= null)
		{	
			String nombres = (String) request.getParameter("nombres");
			if (nombres != null)
				obj.setNombres(nombres.toUpperCase().trim());
			String apellidosPaterno = (String) request.getParameter("apellidosPaterno");
			if (apellidosPaterno != null)
			obj.setApellidos_paterno(apellidosPaterno.toUpperCase().trim());
			String apellidosMaterno = (String) request.getParameter("apellidosMaterno");
			if (apellidosMaterno != null)
				obj.setApellidos_materno(apellidosMaterno.toUpperCase().trim());
			String dni = (String) request.getParameter("dni");
			if((String) request.getParameter("correo") != null)
				correo = (String) request.getParameter("correo");
			if (dni!= null)
				obj.setDni(dni.trim());
			if (coddep != null)
				obj.setCoddep(coddep);
			if (codpro != null)
				obj.setCodpro(codpro);
			if (coddis != null)
				obj.setCoddis(coddis);
			
		}
		obj.setMensaje("");
		
		if (accion != null)
			if (accion.equals("DEL"))
			{
				censoService.eliminarCandidato(idServicioCivil, dniUsuario);
				accion = "BUSCAR";
				obj.setMensaje("Se eliminó al candidato a participante.");
			}	
		
		if (accion != null)
			if (accion.equals("OFICIALIZAR"))
			{
				String vSqlOfi = (String) session.getAttribute("QUERY");
				censoService.oficializarCandidatos(vSqlOfi, dniUsuario, idTest);
				accion = "BUSCAR";
				obj.setMensaje("Se oficializaron los participante.");
			}	
		
		if (accion != null)
			if (accion.equals("DELTODO"))
			{
				String vSqlOfi = (String) session.getAttribute("QUERY");
				censoService.eliminarCandidatos(vSqlOfi, dniUsuario);
				accion = "BUSCAR";
				obj.setMensaje("Se eliminaron los candidatos a participante.");
			}	

		//accion = obj.getAccion();

		estadoRegistro = (String) request.getParameter("estadoRegistro"); 
		
		if (accion != null)
		{	
			if (!accion.equals("BUSCAR"))
				objPrevio = (ParticipanteBusqueda)session.getAttribute("OBJ_PARTIC_BUSQ");
			if (accion.equals("BUSCAR"))
				session.setAttribute("OBJ_PARTIC_BUSQ", obj);
		}
	}
	else
	{
		obj = (ParticipanteBusqueda)session.getAttribute("OBJ_PARTIC_BUSQ");
		accion = obj.getAccion();
	}
		
		List  RptResponsables = null;
		String vSql = "";
		if (accion != null)
		if (accion.equals("BUSCAR"))
		{
			vSql = censoService.obtenerQueryParticipanteOficializar(obj,dniUsuario);
			RptResponsables = censoService.ObtenerParticipanteOficializar(vSql);
			session.setAttribute("QUERY", vSql);
		}
		else
		{
			if (objPrevio != null)
			{
				vSql = censoService.obtenerQueryParticipanteOficializar(objPrevio, dniUsuario);
				RptResponsables = censoService.ObtenerParticipanteOficializar(vSql);
			}
		}	
		
		if(obj.getMensaje().equals(""))
		{
				if(accion == null)
					obj.setMensaje("Seleccione criterios de búsqueda");
				if(RptResponsables == null)
					obj.setMensaje("Sin resultados para mostrar.");
				if(RptResponsables != null && RptResponsables.size() == 0)
					obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
				if(RptResponsables != null && RptResponsables.size() == 1)
					obj.setMensaje("Total: "+ RptResponsables.size()+ " coincidencia para los filtros seleccionados.");
				if(RptResponsables != null && RptResponsables.size() > 1)
					obj.setMensaje("Total: "+ RptResponsables.size()+ " coincidencias para los filtros seleccionados.");
		}
		request.setAttribute("DATALIST", RptResponsables);	
		obj.setAccion("BUSCAR");
		
		if (RptResponsables != null)
		{
			if (RptResponsables.size() > 0)
				obj.setConResultado("1");
			else
				obj.setConResultado("0");
		}
		else
		{
			obj.setConResultado("0");
		}
		
		obj.setAccion(accion);

		if (estadoRegistro != null)
			obj.setEstadoRegistro(estadoRegistro);

		return obj;
	}
}
